library(tidyverse)
library(lubridate)
library(gridExtra)
library(forcats)
# USA data
usa_state <- read_csv("data/covid-19-data/us-states.csv") %>%
  filter(!fips %in% c(60, 11, 72, 78, 66, 69)) %>%
  group_by(state, fips) %>%
  arrange(date) %>%
  mutate(diff_log_cases = c(0, diff(log(cases))),
         diff_log_deaths = c(0, diff(log(deaths)))) %>%
  ungroup()

# nytimes shelter in place dates
sipo_nyt <- read_csv("data/shelter_in_place_dates.csv",
                     col_types = cols(fips = col_character(),
                                      state = col_character(),
                                      shelter_in_place = col_date()))



# join policies with state info
usa_state_panel <- usa_state %>% 
    left_join(sipo_nyt, by = c("fips", "state")) %>%
    mutate(
        shelter_in_place_bin =  replace_na(1 * (date >= shelter_in_place), 0)
          )

# get first date with >= 10 cases
usa_state_panel %>%
  group_by(fips) %>%
  summarise(tenth_date = min(date[cases >= 10])) %>%
  inner_join(usa_state_panel) %>%
  mutate(date_case = date - tenth_date) %>%
  ungroup() -> usa_state_panel

# drop all days with less than 10 cases
# drop dates after states start reponening
usa_state_panel %>%
  filter(cases >= 10,
         # some states started opening up here
         date <= ymd("2020-04-26") 
         ) -> usa_state_panel_tenth

policy_var <- "shelter_in_place"
policy_var_bin <- paste0(policy_var, "_bin")

Treatment timing plots

usa_state_panel_tenth %>%
  mutate(policy_var_bin = .[, paste0(policy_var, "_bin"), drop = TRUE],
         policy_var = .[, policy_var, drop = TRUE],
         policy_var = replace_na(policy_var, ymd("3000-01-01"))) %>%
  mutate(state = fct_reorder(state, policy_var, .desc = T)) %>%
  ggplot(aes(x = date, y = state, fill = as.factor(policy_var_bin))) +
  geom_tile(color = "black") + 
  scale_fill_brewer(str_to_title("Stay at Home Order"), 
                    labels = c("Not-Enacted", "Enacted"),
                    type = "qual", palette = "Set1") +
  # facet_grid(state ~ ., scales = "free_y", space = "free_y") +
  xlab("Calendar date") +
  ylab("") +
  theme_classic(18) +
  theme(legend.position = "bottom",
        axis.ticks.x = element_blank()) -> panel_plot_cal
usa_state_panel_tenth %>%
  mutate(policy_var_bin = .[, paste0(policy_var, "_bin"), drop = TRUE],
         policy_var = .[, policy_var, drop = TRUE],
         policy_var = replace_na(policy_var, ymd("3000-01-01"))) %>%
  mutate(state = fct_reorder(state, 
                            policy_var - tenth_date, 
                            .desc = T)) %>%
  ggplot(aes(x = date_case, y = state, fill = as.factor(policy_var_bin))) +
  geom_tile(color = "black") + 
  scale_fill_brewer(str_to_title("Stay at Home Order"), 
                    labels = c("Not-Enacted", "Enacted"),
                    type = "qual", palette = "Set1") +
  xlab("Days since tenth case") +
  ylab("") +
  coord_cartesian(expand = c(0,0)) +
  theme_classic(18) +
  theme(legend.position = "bottom",
        axis.ticks.x = element_blank()) -> panel_plot_case
grid.arrange(panel_plot_cal, panel_plot_case, nrow = 1)

panel_plot_cal +
  scale_fill_manual(str_to_title("Stay at Home Order"),
                    values = c("white", "grey50"),
                    labels = c("Not-Enacted", "Enacted")) -> panel_plot_cal_bw

panel_plot_case +
  scale_fill_manual(str_to_title("Stay at Home Order"),
                    values = c("white", "grey50"),
                    labels = c("Not-Enacted", "Enacted")) -> panel_plot_case_bw

grid.arrange(panel_plot_cal_bw, panel_plot_case_bw, nrow = 1)

Treatment effect estimates

source("code/helper_funcs.R")

usa_state_panel_tenth %>%
  mutate(log_cases = log(cases)) %>%
fit_event_jack("log_cases",   "date", "state",
          policy_var, ., 30) %>%
  mutate(type = "Calendar Time") -> event_cal_state

usa_state_panel_tenth %>% 
  mutate(log_cases = log(cases),
         shelter_in_place_case = shelter_in_place - tenth_date) %>%
fit_event_jack("log_cases",   "date_case", "state",
          paste0(policy_var, "_case"), ., 30) %>%
   mutate(type = "Case Time") -> event_case_state

fit_event_jack("diff_log_cases",   "date", "state",
          policy_var, usa_state_panel_tenth, 30) %>%
   mutate(type = "Calendar Time") -> event_cal_growth_state

usa_state_panel_tenth %>% 
  mutate(shelter_in_place_case = shelter_in_place - tenth_date) %>%
fit_event_jack("diff_log_cases",   "date_case", "state",
          paste0(policy_var, "_case"), ., 30) %>%
   mutate(type = "Case Time") -> event_case_growth_state
usa_state_panel_tenth %>%
fit_event_jack("cases",   "date", "state",
          policy_var, ., 30) %>%
  mutate(type = "Calendar Time") -> event_cal_raw_state

usa_state_panel_tenth %>% 
  mutate(shelter_in_place_case = shelter_in_place - tenth_date) %>%
fit_event_jack("cases",   "date_case", "state",
          paste0(policy_var, "_case"), ., 30) %>%
   mutate(type = "Case Time") -> event_case_raw_state
usa_state_panel_tenth %>%
mutate(case_ratio = exp(diff_log_cases)) %>%
fit_event_jack("case_ratio",   "date", "state",
          policy_var, ., 30) %>%
  mutate(type = "Calendar Time") -> event_cal_ratio_state

usa_state_panel_tenth %>% 
  mutate(case_ratio = exp(diff_log_cases),
         shelter_in_place_case = shelter_in_place - tenth_date) %>%
fit_event_jack("case_ratio",   "date_case", "state",
          paste0(policy_var, "_case"), ., 30) %>%
   mutate(type = "Case Time") -> event_case_ratio_state
bind_rows(event_cal_state %>% mutate(outcome = "Log Cases"),
          event_cal_growth_state %>% mutate(outcome = "Log Case Growth")) %>%
  group_by(event_time, outcome) %>%
  filter(sum(nt) > 2) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "average") %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0)) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high)) +
 facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
xlab("Days from statewide stay at home order") +
ylab("Estimated effect") +
theme_bw(18)

bind_rows(event_case_state %>% mutate(outcome = "Log Cases"),
          event_case_growth_state %>% mutate(outcome = "Log Case Growth")) %>%
  group_by(event_time, outcome) %>%
  filter(sum(nt) > 2) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "average") %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0)) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high)) +
  facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
  xlab("Days from statewide stay at home order") +
  ylab("Estimated effect") +
  theme_bw(18)

bind_rows(event_cal_raw_state %>% mutate(outcome = "Calendar Time"),
          event_case_raw_state %>% mutate(outcome = "Case Time")) %>%
  group_by(event_time, outcome) %>%
  filter(sum(nt) > 2) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "average") %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0)) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high)) +
 facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
xlab("Days from statewide stay at home order") +
ylab("Estimated effect on case counts") +
theme_bw(18)

bind_rows(event_cal_ratio_state %>% mutate(outcome = "Calendar Time"),
          event_case_ratio_state %>% mutate(outcome = "Case Time")) %>%
  group_by(event_time, outcome) %>%
  filter(sum(nt) > 2) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "average") %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0)) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high)) +
 facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
xlab("Days from statewide stay at home order") +
ylab("Estimated effect on daily case growth") +
theme_bw(18)

March 23rd cohort vs untreated states

sipo_date <- ymd("2020-03-23")
usa_state_panel_tenth %>% 
  filter(shelter_in_place == sipo_date) %>%
  distinct(state) %>%
  pull(state) -> trt_states
print(paste("Treated states are", paste(trt_states, collapse = ", ")))
[1] "Treated states are Connecticut, Louisiana, Ohio, Oregon, Washington"
usa_state_panel_tenth %>%
  mutate(diff_cases = exp(diff_log_cases),
         policy_var = .[, policy_var, drop = TRUE],
         policy_var_bin = .[, policy_var_bin, drop = TRUE]) %>%
  filter(policy_var == sipo_date | 
         is.na(policy_var)) %>%
  mutate(post = 1 * (date >= sipo_date),
         trt = 1 * ! is.na(policy_var)) %>%
  group_by(date) %>%
  filter(sum(trt) > 1) %>%
  ungroup() %>%
  group_by(post, trt) %>%
  summarise(min_date = min(date), did = mean(diff_log_cases), (exp(did) - 1) * 100)
`summarise()` regrouping output by 'post' (override with `.groups` argument)
bind_rows(event_cal_state %>% mutate(outcome = "Log Cases"),
          event_cal_growth_state %>% mutate(outcome = "Log Case Growth")) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "2020_03_23", nt > 1) %>%
#  filter(event_time >= -21, event_time <= 21) %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0)) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high)) +
 facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
#  scale_y_continuous(trans = "log10") +
xlab("Days from statewide stay at home order") +
ylab("Estimated effect") +
 ggtitle("March 23 Cohort") +
theme_bw(18)

Extra figures

usa_state_panel_tenth %>%
  mutate(policy_var_bin = .[, paste0(policy_var, "_bin"), drop = TRUE],
         policy_var = .[, policy_var, drop = TRUE],
         policy_var = replace_na(policy_var, ymd("3000-01-01"))) %>%
  mutate(state = fct_reorder(state, policy_var, .desc = T)) %>%
  ggplot(aes(x = date, y = state, fill = as.factor(policy_var_bin))) +
  geom_tile(color = "black", alpha = 0) +
  scale_fill_brewer(str_to_title("Stay at Home Order"), 
                    labels = c("Not-Enacted", "Enacted"),
                    type = "qual", palette = "Set1") +
  # facet_grid(state ~ ., scales = "free_y", space = "free_y") +
  xlab("Calendar date") +
  ylab("") +
  theme_classic(18) +
  theme(legend.position = "bottom",
        axis.ticks.x = element_blank())

usa_state_panel_tenth %>%
  mutate(policy_var_bin = .[, paste0(policy_var, "_bin"), drop = TRUE],
         policy_var = .[, policy_var, drop = TRUE],
         policy_var = replace_na(policy_var, ymd("3000-01-01"))) %>%
  mutate(state = fct_reorder(state, policy_var, .desc = T)) %>%
  ggplot(aes(x = date, y = state, fill = as.factor(policy_var_bin))) +
  geom_tile(color = "black", alpha = 0) +
  geom_tile(color = "black", data  = . %>% filter(state == "California", policy_var_bin == 0)) + 
  scale_fill_brewer(str_to_title("Stay at Home Order"), 
                    labels = c("Not-Enacted", "Enacted"),
                    type = "qual", palette = "Set1") +
  # facet_grid(state ~ ., scales = "free_y", space = "free_y") +
  xlab("Calendar date") +
  ylab("") +
  theme_classic(18) +
  theme(legend.position = "bottom",
        axis.ticks.x = element_blank())

usa_state_panel_tenth %>%
  mutate(policy_var_bin = .[, paste0(policy_var, "_bin"), drop = TRUE],
         policy_var = .[, policy_var, drop = TRUE],
         policy_var = replace_na(policy_var, ymd("3000-01-01"))) %>%
  mutate(state = fct_reorder(state, policy_var, .desc = T)) %>%
  ggplot(aes(x = date, y = state, fill = as.factor(policy_var_bin))) +
  geom_tile(color = "black", alpha = 0) +
  geom_tile(color = "black", data  = . %>% filter(state == "California")) + 
  scale_fill_brewer(str_to_title("Stay at Home Order"), 
                    labels = c("Not-Enacted", "Enacted"),
                    type = "qual", palette = "Set1") +
  # facet_grid(state ~ ., scales = "free_y", space = "free_y") +
  xlab("Calendar date") +
  ylab("") +
  theme_classic(18) +
  theme(legend.position = "bottom",
        axis.ticks.x = element_blank())

usa_state_panel_tenth %>%
  mutate(policy_var_bin = .[, paste0(policy_var, "_bin"), drop = TRUE],
         policy_var = .[, policy_var, drop = TRUE],
         policy_var = replace_na(policy_var, ymd("3000-01-01"))) %>%
  mutate(state = fct_reorder(state, policy_var, .desc = T)) %>%
  ggplot(aes(x = date, y = state, fill = as.factor(policy_var_bin))) +
  geom_tile(color = "black") +
  scale_fill_brewer(str_to_title("Stay at Home Order"), 
                    labels = c("Not-Enacted", "Enacted"),
                    type = "qual", palette = "Set1") +
  # facet_grid(state ~ ., scales = "free_y", space = "free_y") +
  xlab("Calendar date") +
  ylab("") +
  theme_classic(18) +
  theme(legend.position = "bottom",
        axis.ticks.x = element_blank())

usa_state_panel_tenth %>%
  mutate(policy_var_bin = .[, paste0(policy_var, "_bin"), drop = TRUE],
         policy_var = .[, policy_var, drop = TRUE],
         policy_var = replace_na(policy_var, ymd("3000-01-01"))) %>%
  mutate(state = fct_reorder(state, 
                            policy_var - tenth_date, 
                            .desc = T)) %>%
  ggplot(aes(x = date_case, y = state, fill = as.factor(policy_var_bin))) +
  geom_tile(color = "black") + 
  scale_fill_brewer(str_to_title("Stay at Home Order"), 
                    labels = c("Not-Enacted", "Enacted"),
                    type = "qual", palette = "Set1") +
  xlab("Days since tenth case") +
  ylab("") +
  coord_cartesian(expand = c(0,0)) +
  theme_classic(18) +
  theme(legend.position = "bottom",
        axis.ticks.x = element_blank())

bind_rows(event_cal_state %>% mutate(outcome = "Log Cases"),
          event_cal_growth_state %>% mutate(outcome = "Log Case Growth")) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "2020_03_23", nt > 1,
         outcome == "Log Case Growth") %>%
#  filter(event_time >= -21, event_time <= 21) %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0), color = "#FDB515", size = 5) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high), alpha = 0) +
  facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
  xlab("Days from statewide stay at home order") +
  ylab("Estimated effect") +
  ggtitle("March 23 Cohort") +
  theme_bw(18)

bind_rows(event_cal_state %>% mutate(outcome = "Log Cases"),
          event_cal_growth_state %>% mutate(outcome = "Log Case Growth")) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "2020_03_23", nt > 1,
         outcome == "Log Case Growth") %>%
#  filter(event_time >= -21, event_time <= 21) %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0), color = "#FDB515", size = 5) +
  geom_point(data = . %>% filter(event_time == 10), color = "#FDB515", size = 5) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high), alpha = 0) +
  facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
  xlab("Days from statewide stay at home order") +
  ylab("Estimated effect") +
  ggtitle("March 23 Cohort") +
  theme_bw(18)

bind_rows(event_cal_state %>% mutate(outcome = "Log Cases"),
          event_cal_growth_state %>% mutate(outcome = "Log Case Growth")) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "2020_03_23", nt > 1,
         outcome == "Log Case Growth") %>%
#  filter(event_time >= -21, event_time <= 21) %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0), color = "#FDB515", size = 5) +
  geom_point(data = . %>% filter(event_time %in% c(-10, 10)), color = "#FDB515", size = 5) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high), alpha = 0) +
  facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
  xlab("Days from statewide stay at home order") +
  ylab("Estimated effect") +
  ggtitle("March 23 Cohort") +
  theme_bw(18)

bind_rows(event_cal_state %>% mutate(outcome = "Log Cases"),
          event_cal_growth_state %>% mutate(outcome = "Log Case Growth")) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "2020_03_23", nt > 1,
         outcome == "Log Case Growth") %>%
#  filter(event_time >= -21, event_time <= 21) %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0)) +
  geom_point() +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high), alpha = 0) +
  facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
  xlab("Days from statewide stay at home order") +
  ylab("Estimated effect") +
  ggtitle("March 23 Cohort") +
  theme_bw(18)

bind_rows(event_cal_state %>% mutate(outcome = "Log Cases"),
          event_cal_growth_state %>% mutate(outcome = "Log Case Growth")) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "2020_03_23", nt > 1,
         outcome == "Log Case Growth") %>%
#  filter(event_time >= -21, event_time <= 21) %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0)) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high)) +
  facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
  xlab("Days from statewide stay at home order") +
  ylab("Estimated effect") +
  ggtitle("March 23 Cohort") +
  theme_bw(18)

bind_rows(event_cal_growth_state %>% mutate(outcome = "Log Case Growth")) %>%
  group_by(event_time, outcome) %>%
  filter(sum(nt) > 2) %>%
  mutate(conf.low = estimate - 2 * se, conf.high = estimate + 2 * se) %>%
  filter(cohort == "average") %>%
  ggplot(aes(x = event_time, y = estimate)) +
  geom_hline(yintercept = 0, lty = 2) +
  geom_vline(xintercept = -0.5, lty = 2) +
  geom_point(data = data.frame(event_time = -1, estimate = 0)) +
  geom_pointrange(aes(ymin = conf.low, ymax = conf.high)) +
 facet_wrap(~ outcome, ncol = 2, scales = "free_y") +
xlab("Days from statewide stay at home order") +
ylab("Estimated effect") +
theme_bw(18)

LS0tCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCi0tLQoKYGBge3IgYm9pbGVycGxhdGUsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gRn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShmb3JjYXRzKQpgYGAKCmBgYHtyIHJlYWRfc3RhdGVfZGF0YSwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSBGfQojIFVTQSBkYXRhCnVzYV9zdGF0ZSA8LSByZWFkX2NzdigiZGF0YS9jb3ZpZC0xOS1kYXRhL3VzLXN0YXRlcy5jc3YiKSAlPiUKICBmaWx0ZXIoIWZpcHMgJWluJSBjKDYwLCAxMSwgNzIsIDc4LCA2NiwgNjkpKSAlPiUKICBncm91cF9ieShzdGF0ZSwgZmlwcykgJT4lCiAgYXJyYW5nZShkYXRlKSAlPiUKICBtdXRhdGUoZGlmZl9sb2dfY2FzZXMgPSBjKDAsIGRpZmYobG9nKGNhc2VzKSkpLAogICAgICAgICBkaWZmX2xvZ19kZWF0aHMgPSBjKDAsIGRpZmYobG9nKGRlYXRocykpKSkgJT4lCiAgdW5ncm91cCgpCgojIG55dGltZXMgc2hlbHRlciBpbiBwbGFjZSBkYXRlcwpzaXBvX255dCA8LSByZWFkX2NzdigiZGF0YS9zaGVsdGVyX2luX3BsYWNlX2RhdGVzLmNzdiIsCiAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoZmlwcyA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsdGVyX2luX3BsYWNlID0gY29sX2RhdGUoKSkpCgoKCiMgam9pbiBwb2xpY2llcyB3aXRoIHN0YXRlIGluZm8KdXNhX3N0YXRlX3BhbmVsIDwtIHVzYV9zdGF0ZSAlPiUgCiAgICBsZWZ0X2pvaW4oc2lwb19ueXQsIGJ5ID0gYygiZmlwcyIsICJzdGF0ZSIpKSAlPiUKICAgIG11dGF0ZSgKICAgICAgICBzaGVsdGVyX2luX3BsYWNlX2JpbiA9ICByZXBsYWNlX25hKDEgKiAoZGF0ZSA+PSBzaGVsdGVyX2luX3BsYWNlKSwgMCkKICAgICAgICAgICkKCiMgZ2V0IGZpcnN0IGRhdGUgd2l0aCA+PSAxMCBjYXNlcwp1c2Ffc3RhdGVfcGFuZWwgJT4lCiAgZ3JvdXBfYnkoZmlwcykgJT4lCiAgc3VtbWFyaXNlKHRlbnRoX2RhdGUgPSBtaW4oZGF0ZVtjYXNlcyA+PSAxMF0pKSAlPiUKICBpbm5lcl9qb2luKHVzYV9zdGF0ZV9wYW5lbCkgJT4lCiAgbXV0YXRlKGRhdGVfY2FzZSA9IGRhdGUgLSB0ZW50aF9kYXRlKSAlPiUKICB1bmdyb3VwKCkgLT4gdXNhX3N0YXRlX3BhbmVsCgojIGRyb3AgYWxsIGRheXMgd2l0aCBsZXNzIHRoYW4gMTAgY2FzZXMKIyBkcm9wIGRhdGVzIGFmdGVyIHN0YXRlcyBzdGFydCByZXBvbmVuaW5nCnVzYV9zdGF0ZV9wYW5lbCAlPiUKICBmaWx0ZXIoY2FzZXMgPj0gMTAsCiAgICAgICAgICMgc29tZSBzdGF0ZXMgc3RhcnRlZCBvcGVuaW5nIHVwIGhlcmUKICAgICAgICAgZGF0ZSA8PSB5bWQoIjIwMjAtMDQtMjYiKSAKICAgICAgICAgKSAtPiB1c2Ffc3RhdGVfcGFuZWxfdGVudGgKCnBvbGljeV92YXIgPC0gInNoZWx0ZXJfaW5fcGxhY2UiCnBvbGljeV92YXJfYmluIDwtIHBhc3RlMChwb2xpY3lfdmFyLCAiX2JpbiIpCmBgYAoKIyMgVHJlYXRtZW50IHRpbWluZyBwbG90cwoKYGBge3Igc2lwb19jYWxlbmRhcl90aW1lX3N0YXRlLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgp1c2Ffc3RhdGVfcGFuZWxfdGVudGggJT4lCiAgbXV0YXRlKHBvbGljeV92YXJfYmluID0gLlssIHBhc3RlMChwb2xpY3lfdmFyLCAiX2JpbiIpLCBkcm9wID0gVFJVRV0sCiAgICAgICAgIHBvbGljeV92YXIgPSAuWywgcG9saWN5X3ZhciwgZHJvcCA9IFRSVUVdLAogICAgICAgICBwb2xpY3lfdmFyID0gcmVwbGFjZV9uYShwb2xpY3lfdmFyLCB5bWQoIjMwMDAtMDEtMDEiKSkpICU+JQogIG11dGF0ZShzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCBwb2xpY3lfdmFyLCAuZGVzYyA9IFQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gc3RhdGUsIGZpbGwgPSBhcy5mYWN0b3IocG9saWN5X3Zhcl9iaW4pKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsgCiAgc2NhbGVfZmlsbF9icmV3ZXIoc3RyX3RvX3RpdGxlKCJTdGF5IGF0IEhvbWUgT3JkZXIiKSwgCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm90LUVuYWN0ZWQiLCAiRW5hY3RlZCIpLAogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAicXVhbCIsIHBhbGV0dGUgPSAiU2V0MSIpICsKICAjIGZhY2V0X2dyaWQoc3RhdGUgfiAuLCBzY2FsZXMgPSAiZnJlZV95Iiwgc3BhY2UgPSAiZnJlZV95IikgKwogIHhsYWIoIkNhbGVuZGFyIGRhdGUiKSArCiAgeWxhYigiIikgKwogIHRoZW1lX2NsYXNzaWMoMTgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkpIC0+IHBhbmVsX3Bsb3RfY2FsCgpgYGAKCmBgYHtyIHNpcG9fY2FzZV90aW1lX3N0YXRlLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0V9CnVzYV9zdGF0ZV9wYW5lbF90ZW50aCAlPiUKICBtdXRhdGUocG9saWN5X3Zhcl9iaW4gPSAuWywgcGFzdGUwKHBvbGljeV92YXIsICJfYmluIiksIGRyb3AgPSBUUlVFXSwKICAgICAgICAgcG9saWN5X3ZhciA9IC5bLCBwb2xpY3lfdmFyLCBkcm9wID0gVFJVRV0sCiAgICAgICAgIHBvbGljeV92YXIgPSByZXBsYWNlX25hKHBvbGljeV92YXIsIHltZCgiMzAwMC0wMS0wMSIpKSkgJT4lCiAgbXV0YXRlKHN0YXRlID0gZmN0X3Jlb3JkZXIoc3RhdGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5X3ZhciAtIHRlbnRoX2RhdGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2MgPSBUKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZV9jYXNlLCB5ID0gc3RhdGUsIGZpbGwgPSBhcy5mYWN0b3IocG9saWN5X3Zhcl9iaW4pKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsgCiAgc2NhbGVfZmlsbF9icmV3ZXIoc3RyX3RvX3RpdGxlKCJTdGF5IGF0IEhvbWUgT3JkZXIiKSwgCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm90LUVuYWN0ZWQiLCAiRW5hY3RlZCIpLAogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAicXVhbCIsIHBhbGV0dGUgPSAiU2V0MSIpICsKICB4bGFiKCJEYXlzIHNpbmNlIHRlbnRoIGNhc2UiKSArCiAgeWxhYigiIikgKwogIGNvb3JkX2NhcnRlc2lhbihleHBhbmQgPSBjKDAsMCkpICsKICB0aGVtZV9jbGFzc2ljKDE4KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpKSAtPiBwYW5lbF9wbG90X2Nhc2UKYGBgCgpgYGB7ciB0cnRfdGltZXMsIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gOSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CmdyaWQuYXJyYW5nZShwYW5lbF9wbG90X2NhbCwgcGFuZWxfcGxvdF9jYXNlLCBucm93ID0gMSkKYGBgCgpgYGB7ciB0cnRfdGltZXNfYncsIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gOSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CnBhbmVsX3Bsb3RfY2FsICsKICBzY2FsZV9maWxsX21hbnVhbChzdHJfdG9fdGl0bGUoIlN0YXkgYXQgSG9tZSBPcmRlciIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndoaXRlIiwgImdyZXk1MCIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vdC1FbmFjdGVkIiwgIkVuYWN0ZWQiKSkgLT4gcGFuZWxfcGxvdF9jYWxfYncKCnBhbmVsX3Bsb3RfY2FzZSArCiAgc2NhbGVfZmlsbF9tYW51YWwoc3RyX3RvX3RpdGxlKCJTdGF5IGF0IEhvbWUgT3JkZXIiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3aGl0ZSIsICJncmV5NTAiKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOb3QtRW5hY3RlZCIsICJFbmFjdGVkIikpIC0+IHBhbmVsX3Bsb3RfY2FzZV9idwoKZ3JpZC5hcnJhbmdlKHBhbmVsX3Bsb3RfY2FsX2J3LCBwYW5lbF9wbG90X2Nhc2VfYncsIG5yb3cgPSAxKQpgYGAKCgojIyBUcmVhdG1lbnQgZWZmZWN0IGVzdGltYXRlcwoKYGBge3Igc3RhY2tlZF9ldmVudF9zdGF0ZSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSIsIGNhY2hlID0gVFJVRX0Kc291cmNlKCJjb2RlL2hlbHBlcl9mdW5jcy5SIikKCnVzYV9zdGF0ZV9wYW5lbF90ZW50aCAlPiUKICBtdXRhdGUobG9nX2Nhc2VzID0gbG9nKGNhc2VzKSkgJT4lCmZpdF9ldmVudF9qYWNrKCJsb2dfY2FzZXMiLCAgICJkYXRlIiwgInN0YXRlIiwKICAgICAgICAgIHBvbGljeV92YXIsIC4sIDMwKSAlPiUKICBtdXRhdGUodHlwZSA9ICJDYWxlbmRhciBUaW1lIikgLT4gZXZlbnRfY2FsX3N0YXRlCgp1c2Ffc3RhdGVfcGFuZWxfdGVudGggJT4lIAogIG11dGF0ZShsb2dfY2FzZXMgPSBsb2coY2FzZXMpLAogICAgICAgICBzaGVsdGVyX2luX3BsYWNlX2Nhc2UgPSBzaGVsdGVyX2luX3BsYWNlIC0gdGVudGhfZGF0ZSkgJT4lCmZpdF9ldmVudF9qYWNrKCJsb2dfY2FzZXMiLCAgICJkYXRlX2Nhc2UiLCAic3RhdGUiLAogICAgICAgICAgcGFzdGUwKHBvbGljeV92YXIsICJfY2FzZSIpLCAuLCAzMCkgJT4lCiAgIG11dGF0ZSh0eXBlID0gIkNhc2UgVGltZSIpIC0+IGV2ZW50X2Nhc2Vfc3RhdGUKCmZpdF9ldmVudF9qYWNrKCJkaWZmX2xvZ19jYXNlcyIsICAgImRhdGUiLCAic3RhdGUiLAogICAgICAgICAgcG9saWN5X3ZhciwgdXNhX3N0YXRlX3BhbmVsX3RlbnRoLCAzMCkgJT4lCiAgIG11dGF0ZSh0eXBlID0gIkNhbGVuZGFyIFRpbWUiKSAtPiBldmVudF9jYWxfZ3Jvd3RoX3N0YXRlCgp1c2Ffc3RhdGVfcGFuZWxfdGVudGggJT4lIAogIG11dGF0ZShzaGVsdGVyX2luX3BsYWNlX2Nhc2UgPSBzaGVsdGVyX2luX3BsYWNlIC0gdGVudGhfZGF0ZSkgJT4lCmZpdF9ldmVudF9qYWNrKCJkaWZmX2xvZ19jYXNlcyIsICAgImRhdGVfY2FzZSIsICJzdGF0ZSIsCiAgICAgICAgICBwYXN0ZTAocG9saWN5X3ZhciwgIl9jYXNlIiksIC4sIDMwKSAlPiUKICAgbXV0YXRlKHR5cGUgPSAiQ2FzZSBUaW1lIikgLT4gZXZlbnRfY2FzZV9ncm93dGhfc3RhdGUKCmBgYAoKYGBge3IgcmF3X2Nhc2VzLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgcmVzdWx0cyA9ICJoaWRlIiwgY2FjaGUgPSBUUlVFfQp1c2Ffc3RhdGVfcGFuZWxfdGVudGggJT4lCmZpdF9ldmVudF9qYWNrKCJjYXNlcyIsICAgImRhdGUiLCAic3RhdGUiLAogICAgICAgICAgcG9saWN5X3ZhciwgLiwgMzApICU+JQogIG11dGF0ZSh0eXBlID0gIkNhbGVuZGFyIFRpbWUiKSAtPiBldmVudF9jYWxfcmF3X3N0YXRlCgp1c2Ffc3RhdGVfcGFuZWxfdGVudGggJT4lIAogIG11dGF0ZShzaGVsdGVyX2luX3BsYWNlX2Nhc2UgPSBzaGVsdGVyX2luX3BsYWNlIC0gdGVudGhfZGF0ZSkgJT4lCmZpdF9ldmVudF9qYWNrKCJjYXNlcyIsICAgImRhdGVfY2FzZSIsICJzdGF0ZSIsCiAgICAgICAgICBwYXN0ZTAocG9saWN5X3ZhciwgIl9jYXNlIiksIC4sIDMwKSAlPiUKICAgbXV0YXRlKHR5cGUgPSAiQ2FzZSBUaW1lIikgLT4gZXZlbnRfY2FzZV9yYXdfc3RhdGUKYGBgCgpgYGB7ciByYXRpb19jYXNlcywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSIsIGNhY2hlID0gVFJVRX0KdXNhX3N0YXRlX3BhbmVsX3RlbnRoICU+JQptdXRhdGUoY2FzZV9yYXRpbyA9IGV4cChkaWZmX2xvZ19jYXNlcykpICU+JQpmaXRfZXZlbnRfamFjaygiY2FzZV9yYXRpbyIsICAgImRhdGUiLCAic3RhdGUiLAogICAgICAgICAgcG9saWN5X3ZhciwgLiwgMzApICU+JQogIG11dGF0ZSh0eXBlID0gIkNhbGVuZGFyIFRpbWUiKSAtPiBldmVudF9jYWxfcmF0aW9fc3RhdGUKCnVzYV9zdGF0ZV9wYW5lbF90ZW50aCAlPiUgCiAgbXV0YXRlKGNhc2VfcmF0aW8gPSBleHAoZGlmZl9sb2dfY2FzZXMpLAogICAgICAgICBzaGVsdGVyX2luX3BsYWNlX2Nhc2UgPSBzaGVsdGVyX2luX3BsYWNlIC0gdGVudGhfZGF0ZSkgJT4lCmZpdF9ldmVudF9qYWNrKCJjYXNlX3JhdGlvIiwgICAiZGF0ZV9jYXNlIiwgInN0YXRlIiwKICAgICAgICAgIHBhc3RlMChwb2xpY3lfdmFyLCAiX2Nhc2UiKSwgLiwgMzApICU+JQogICBtdXRhdGUodHlwZSA9ICJDYXNlIFRpbWUiKSAtPiBldmVudF9jYXNlX3JhdGlvX3N0YXRlCmBgYAoKYGBge3Igc3RhY2tlZF9ldmVudF9jYWxlbmRhciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQ9NC41LCBjYXB0aW9uID0gIkNhbGVuZGFyIHRpbWUgZXN0aW1hdGVzIn0KYmluZF9yb3dzKGV2ZW50X2NhbF9zdGF0ZSAlPiUgbXV0YXRlKG91dGNvbWUgPSAiTG9nIENhc2VzIiksCiAgICAgICAgICBldmVudF9jYWxfZ3Jvd3RoX3N0YXRlICU+JSBtdXRhdGUob3V0Y29tZSA9ICJMb2cgQ2FzZSBHcm93dGgiKSkgJT4lCiAgZ3JvdXBfYnkoZXZlbnRfdGltZSwgb3V0Y29tZSkgJT4lCiAgZmlsdGVyKHN1bShudCkgPiAyKSAlPiUKICBtdXRhdGUoY29uZi5sb3cgPSBlc3RpbWF0ZSAtIDIgKiBzZSwgY29uZi5oaWdoID0gZXN0aW1hdGUgKyAyICogc2UpICU+JQogIGZpbHRlcihjb2hvcnQgPT0gImF2ZXJhZ2UiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBldmVudF90aW1lLCB5ID0gZXN0aW1hdGUpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0wLjUsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBkYXRhLmZyYW1lKGV2ZW50X3RpbWUgPSAtMSwgZXN0aW1hdGUgPSAwKSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNvbmYubG93LCB5bWF4ID0gY29uZi5oaWdoKSkgKwogZmFjZXRfd3JhcCh+IG91dGNvbWUsIG5jb2wgPSAyLCBzY2FsZXMgPSAiZnJlZV95IikgKwp4bGFiKCJEYXlzIGZyb20gc3RhdGV3aWRlIHN0YXkgYXQgaG9tZSBvcmRlciIpICsKeWxhYigiRXN0aW1hdGVkIGVmZmVjdCIpICsKdGhlbWVfYncoMTgpCmBgYAoKYGBge3Igc3RhY2tlZF9ldmVudF9jYXNlLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQ9NC41LCBjYXB0aW9uID0gIkNhc2UgdGltZSBlc3RpbWF0ZXMifQpiaW5kX3Jvd3MoZXZlbnRfY2FzZV9zdGF0ZSAlPiUgbXV0YXRlKG91dGNvbWUgPSAiTG9nIENhc2VzIiksCiAgICAgICAgICBldmVudF9jYXNlX2dyb3d0aF9zdGF0ZSAlPiUgbXV0YXRlKG91dGNvbWUgPSAiTG9nIENhc2UgR3Jvd3RoIikpICU+JQogIGdyb3VwX2J5KGV2ZW50X3RpbWUsIG91dGNvbWUpICU+JQogIGZpbHRlcihzdW0obnQpID4gMikgJT4lCiAgbXV0YXRlKGNvbmYubG93ID0gZXN0aW1hdGUgLSAyICogc2UsIGNvbmYuaGlnaCA9IGVzdGltYXRlICsgMiAqIHNlKSAlPiUKICBmaWx0ZXIoY29ob3J0ID09ICJhdmVyYWdlIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZXZlbnRfdGltZSwgeSA9IGVzdGltYXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZGF0YS5mcmFtZShldmVudF90aW1lID0gLTEsIGVzdGltYXRlID0gMCkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCkpICsKICBmYWNldF93cmFwKH4gb3V0Y29tZSwgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgeGxhYigiRGF5cyBmcm9tIHN0YXRld2lkZSBzdGF5IGF0IGhvbWUgb3JkZXIiKSArCiAgeWxhYigiRXN0aW1hdGVkIGVmZmVjdCIpICsKICB0aGVtZV9idygxOCkKCmBgYAoKCmBgYHtyIHN0YWNrZWRfZXZlbnRfcmF3LCBtZXNzYWdlID0gRkFMU0UsICBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0PTQuNSwgd2FybmluZyA9IEZBTFNFLCBjYXB0aW9uID0gIkNhc2UgdGltZSBlc3RpbWF0ZXMifQpiaW5kX3Jvd3MoZXZlbnRfY2FsX3Jhd19zdGF0ZSAlPiUgbXV0YXRlKG91dGNvbWUgPSAiQ2FsZW5kYXIgVGltZSIpLAogICAgICAgICAgZXZlbnRfY2FzZV9yYXdfc3RhdGUgJT4lIG11dGF0ZShvdXRjb21lID0gIkNhc2UgVGltZSIpKSAlPiUKICBncm91cF9ieShldmVudF90aW1lLCBvdXRjb21lKSAlPiUKICBmaWx0ZXIoc3VtKG50KSA+IDIpICU+JQogIG11dGF0ZShjb25mLmxvdyA9IGVzdGltYXRlIC0gMiAqIHNlLCBjb25mLmhpZ2ggPSBlc3RpbWF0ZSArIDIgKiBzZSkgJT4lCiAgZmlsdGVyKGNvaG9ydCA9PSAiYXZlcmFnZSIpICU+JQogIGdncGxvdChhZXMoeCA9IGV2ZW50X3RpbWUsIHkgPSBlc3RpbWF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTAuNSwgbHR5ID0gMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGRhdGEuZnJhbWUoZXZlbnRfdGltZSA9IC0xLCBlc3RpbWF0ZSA9IDApKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY29uZi5sb3csIHltYXggPSBjb25mLmhpZ2gpKSArCiBmYWNldF93cmFwKH4gb3V0Y29tZSwgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlX3kiKSArCnhsYWIoIkRheXMgZnJvbSBzdGF0ZXdpZGUgc3RheSBhdCBob21lIG9yZGVyIikgKwp5bGFiKCJFc3RpbWF0ZWQgZWZmZWN0IG9uIGNhc2UgY291bnRzIikgKwp0aGVtZV9idygxOCkKCmBgYAoKYGBge3Igc3RhY2tlZF9ldmVudF9yYXRpbywgbWVzc2FnZSA9IEZBTFNFLCAgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodD00LjUsIHdhcm5pbmcgPSBGQUxTRSwgY2FwdGlvbiA9ICJDYXNlIHRpbWUgZXN0aW1hdGVzIn0KYmluZF9yb3dzKGV2ZW50X2NhbF9yYXRpb19zdGF0ZSAlPiUgbXV0YXRlKG91dGNvbWUgPSAiQ2FsZW5kYXIgVGltZSIpLAogICAgICAgICAgZXZlbnRfY2FzZV9yYXRpb19zdGF0ZSAlPiUgbXV0YXRlKG91dGNvbWUgPSAiQ2FzZSBUaW1lIikpICU+JQogIGdyb3VwX2J5KGV2ZW50X3RpbWUsIG91dGNvbWUpICU+JQogIGZpbHRlcihzdW0obnQpID4gMikgJT4lCiAgbXV0YXRlKGNvbmYubG93ID0gZXN0aW1hdGUgLSAyICogc2UsIGNvbmYuaGlnaCA9IGVzdGltYXRlICsgMiAqIHNlKSAlPiUKICBmaWx0ZXIoY29ob3J0ID09ICJhdmVyYWdlIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZXZlbnRfdGltZSwgeSA9IGVzdGltYXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZGF0YS5mcmFtZShldmVudF90aW1lID0gLTEsIGVzdGltYXRlID0gMCkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCkpICsKIGZhY2V0X3dyYXAofiBvdXRjb21lLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeSIpICsKeGxhYigiRGF5cyBmcm9tIHN0YXRld2lkZSBzdGF5IGF0IGhvbWUgb3JkZXIiKSArCnlsYWIoIkVzdGltYXRlZCBlZmZlY3Qgb24gZGFpbHkgY2FzZSBncm93dGgiKSArCnRoZW1lX2J3KDE4KQoKYGBgCgoKIyMgTWFyY2ggMjNyZCBjb2hvcnQgdnMgdW50cmVhdGVkIHN0YXRlcwoKYGBge3Igd2hpY2hfc3RhdGVzfQpzaXBvX2RhdGUgPC0geW1kKCIyMDIwLTAzLTIzIikKdXNhX3N0YXRlX3BhbmVsX3RlbnRoICU+JSAKICBmaWx0ZXIoc2hlbHRlcl9pbl9wbGFjZSA9PSBzaXBvX2RhdGUpICU+JQogIGRpc3RpbmN0KHN0YXRlKSAlPiUKICBwdWxsKHN0YXRlKSAtPiB0cnRfc3RhdGVzCnByaW50KHBhc3RlKCJUcmVhdGVkIHN0YXRlcyBhcmUiLCBwYXN0ZSh0cnRfc3RhdGVzLCBjb2xsYXBzZSA9ICIsICIpKSkKYGBgCgpgYGB7ciBtYXIyM18yeDJfZGlkX2NhbH0KdXNhX3N0YXRlX3BhbmVsX3RlbnRoICU+JQogIG11dGF0ZShkaWZmX2Nhc2VzID0gZXhwKGRpZmZfbG9nX2Nhc2VzKSwKICAgICAgICAgcG9saWN5X3ZhciA9IC5bLCBwb2xpY3lfdmFyLCBkcm9wID0gVFJVRV0sCiAgICAgICAgIHBvbGljeV92YXJfYmluID0gLlssIHBvbGljeV92YXJfYmluLCBkcm9wID0gVFJVRV0pICU+JQogIGZpbHRlcihwb2xpY3lfdmFyID09IHNpcG9fZGF0ZSB8IAogICAgICAgICBpcy5uYShwb2xpY3lfdmFyKSkgJT4lCiAgbXV0YXRlKHBvc3QgPSAxICogKGRhdGUgPj0gc2lwb19kYXRlKSwKICAgICAgICAgdHJ0ID0gMSAqICEgaXMubmEocG9saWN5X3ZhcikpICU+JQogIGdyb3VwX2J5KGRhdGUpICU+JQogIGZpbHRlcihzdW0odHJ0KSA+IDEpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShwb3N0LCB0cnQpICU+JQogIHN1bW1hcmlzZShtaW5fZGF0ZSA9IG1pbihkYXRlKSwgZGlkID0gbWVhbihkaWZmX2xvZ19jYXNlcyksIChleHAoZGlkKSAtIDEpICogMTAwKQpgYGAKCmBgYHtyIG1hcjIzX2NvaG9ydF9jYWxfY2FzZV9kaWZmLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0PTQuNSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CmJpbmRfcm93cyhldmVudF9jYWxfc3RhdGUgJT4lIG11dGF0ZShvdXRjb21lID0gIkxvZyBDYXNlcyIpLAogICAgICAgICAgZXZlbnRfY2FsX2dyb3d0aF9zdGF0ZSAlPiUgbXV0YXRlKG91dGNvbWUgPSAiTG9nIENhc2UgR3Jvd3RoIikpICU+JQogIG11dGF0ZShjb25mLmxvdyA9IGVzdGltYXRlIC0gMiAqIHNlLCBjb25mLmhpZ2ggPSBlc3RpbWF0ZSArIDIgKiBzZSkgJT4lCiAgZmlsdGVyKGNvaG9ydCA9PSAiMjAyMF8wM18yMyIsIG50ID4gMSkgJT4lCiMgIGZpbHRlcihldmVudF90aW1lID49IC0yMSwgZXZlbnRfdGltZSA8PSAyMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZXZlbnRfdGltZSwgeSA9IGVzdGltYXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZGF0YS5mcmFtZShldmVudF90aW1lID0gLTEsIGVzdGltYXRlID0gMCkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCkpICsKIGZhY2V0X3dyYXAofiBvdXRjb21lLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeSIpICsKIyAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikgKwp4bGFiKCJEYXlzIGZyb20gc3RhdGV3aWRlIHN0YXkgYXQgaG9tZSBvcmRlciIpICsKeWxhYigiRXN0aW1hdGVkIGVmZmVjdCIpICsKIGdndGl0bGUoIk1hcmNoIDIzIENvaG9ydCIpICsKdGhlbWVfYncoMTgpCmBgYAoKIyMgRXh0cmEgZmlndXJlcwoKYGBge3Igc2lwb19jYWxlbmRhcl90aW1lX2VtcHR5LCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9Cgp1c2Ffc3RhdGVfcGFuZWxfdGVudGggJT4lCiAgbXV0YXRlKHBvbGljeV92YXJfYmluID0gLlssIHBhc3RlMChwb2xpY3lfdmFyLCAiX2JpbiIpLCBkcm9wID0gVFJVRV0sCiAgICAgICAgIHBvbGljeV92YXIgPSAuWywgcG9saWN5X3ZhciwgZHJvcCA9IFRSVUVdLAogICAgICAgICBwb2xpY3lfdmFyID0gcmVwbGFjZV9uYShwb2xpY3lfdmFyLCB5bWQoIjMwMDAtMDEtMDEiKSkpICU+JQogIG11dGF0ZShzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCBwb2xpY3lfdmFyLCAuZGVzYyA9IFQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gc3RhdGUsIGZpbGwgPSBhcy5mYWN0b3IocG9saWN5X3Zhcl9iaW4pKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIGFscGhhID0gMCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHN0cl90b190aXRsZSgiU3RheSBhdCBIb21lIE9yZGVyIiksIAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vdC1FbmFjdGVkIiwgIkVuYWN0ZWQiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInF1YWwiLCBwYWxldHRlID0gIlNldDEiKSArCiAgIyBmYWNldF9ncmlkKHN0YXRlIH4gLiwgc2NhbGVzID0gImZyZWVfeSIsIHNwYWNlID0gImZyZWVfeSIpICsKICB4bGFiKCJDYWxlbmRhciBkYXRlIikgKwogIHlsYWIoIiIpICsKICB0aGVtZV9jbGFzc2ljKDE4KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpKQoKYGBgCgoKCmBgYHtyIHNpcG9fY2FsZW5kYXJfdGltZV9jYV9wcmUsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA5LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnVzYV9zdGF0ZV9wYW5lbF90ZW50aCAlPiUKICBtdXRhdGUocG9saWN5X3Zhcl9iaW4gPSAuWywgcGFzdGUwKHBvbGljeV92YXIsICJfYmluIiksIGRyb3AgPSBUUlVFXSwKICAgICAgICAgcG9saWN5X3ZhciA9IC5bLCBwb2xpY3lfdmFyLCBkcm9wID0gVFJVRV0sCiAgICAgICAgIHBvbGljeV92YXIgPSByZXBsYWNlX25hKHBvbGljeV92YXIsIHltZCgiMzAwMC0wMS0wMSIpKSkgJT4lCiAgbXV0YXRlKHN0YXRlID0gZmN0X3Jlb3JkZXIoc3RhdGUsIHBvbGljeV92YXIsIC5kZXNjID0gVCkpICU+JQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBzdGF0ZSwgZmlsbCA9IGFzLmZhY3Rvcihwb2xpY3lfdmFyX2JpbikpKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgZGF0YSAgPSAuICU+JSBmaWx0ZXIoc3RhdGUgPT0gIkNhbGlmb3JuaWEiLCBwb2xpY3lfdmFyX2JpbiA9PSAwKSkgKyAKICBzY2FsZV9maWxsX2JyZXdlcihzdHJfdG9fdGl0bGUoIlN0YXkgYXQgSG9tZSBPcmRlciIpLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOb3QtRW5hY3RlZCIsICJFbmFjdGVkIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJxdWFsIiwgcGFsZXR0ZSA9ICJTZXQxIikgKwogICMgZmFjZXRfZ3JpZChzdGF0ZSB+IC4sIHNjYWxlcyA9ICJmcmVlX3kiLCBzcGFjZSA9ICJmcmVlX3kiKSArCiAgeGxhYigiQ2FsZW5kYXIgZGF0ZSIpICsKICB5bGFiKCIiKSArCiAgdGhlbWVfY2xhc3NpYygxOCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkKCmBgYAoKYGBge3Igc2lwb19jYWxlbmRhcl90aW1lX2NhX3Bvc3QsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA5LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnVzYV9zdGF0ZV9wYW5lbF90ZW50aCAlPiUKICBtdXRhdGUocG9saWN5X3Zhcl9iaW4gPSAuWywgcGFzdGUwKHBvbGljeV92YXIsICJfYmluIiksIGRyb3AgPSBUUlVFXSwKICAgICAgICAgcG9saWN5X3ZhciA9IC5bLCBwb2xpY3lfdmFyLCBkcm9wID0gVFJVRV0sCiAgICAgICAgIHBvbGljeV92YXIgPSByZXBsYWNlX25hKHBvbGljeV92YXIsIHltZCgiMzAwMC0wMS0wMSIpKSkgJT4lCiAgbXV0YXRlKHN0YXRlID0gZmN0X3Jlb3JkZXIoc3RhdGUsIHBvbGljeV92YXIsIC5kZXNjID0gVCkpICU+JQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBzdGF0ZSwgZmlsbCA9IGFzLmZhY3Rvcihwb2xpY3lfdmFyX2JpbikpKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgZGF0YSAgPSAuICU+JSBmaWx0ZXIoc3RhdGUgPT0gIkNhbGlmb3JuaWEiKSkgKyAKICBzY2FsZV9maWxsX2JyZXdlcihzdHJfdG9fdGl0bGUoIlN0YXkgYXQgSG9tZSBPcmRlciIpLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOb3QtRW5hY3RlZCIsICJFbmFjdGVkIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJxdWFsIiwgcGFsZXR0ZSA9ICJTZXQxIikgKwogICMgZmFjZXRfZ3JpZChzdGF0ZSB+IC4sIHNjYWxlcyA9ICJmcmVlX3kiLCBzcGFjZSA9ICJmcmVlX3kiKSArCiAgeGxhYigiQ2FsZW5kYXIgZGF0ZSIpICsKICB5bGFiKCIiKSArCiAgdGhlbWVfY2xhc3NpYygxOCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkKCmBgYAoKYGBge3Igc2lwb19jYWxlbmRhcl90aW1lX2FsbCwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKdXNhX3N0YXRlX3BhbmVsX3RlbnRoICU+JQogIG11dGF0ZShwb2xpY3lfdmFyX2JpbiA9IC5bLCBwYXN0ZTAocG9saWN5X3ZhciwgIl9iaW4iKSwgZHJvcCA9IFRSVUVdLAogICAgICAgICBwb2xpY3lfdmFyID0gLlssIHBvbGljeV92YXIsIGRyb3AgPSBUUlVFXSwKICAgICAgICAgcG9saWN5X3ZhciA9IHJlcGxhY2VfbmEocG9saWN5X3ZhciwgeW1kKCIzMDAwLTAxLTAxIikpKSAlPiUKICBtdXRhdGUoc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSwgcG9saWN5X3ZhciwgLmRlc2MgPSBUKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IHN0YXRlLCBmaWxsID0gYXMuZmFjdG9yKHBvbGljeV92YXJfYmluKSkpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIoc3RyX3RvX3RpdGxlKCJTdGF5IGF0IEhvbWUgT3JkZXIiKSwgCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm90LUVuYWN0ZWQiLCAiRW5hY3RlZCIpLAogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAicXVhbCIsIHBhbGV0dGUgPSAiU2V0MSIpICsKICAjIGZhY2V0X2dyaWQoc3RhdGUgfiAuLCBzY2FsZXMgPSAiZnJlZV95Iiwgc3BhY2UgPSAiZnJlZV95IikgKwogIHhsYWIoIkNhbGVuZGFyIGRhdGUiKSArCiAgeWxhYigiIikgKwogIHRoZW1lX2NsYXNzaWMoMTgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCmBgYHtyIHNpcG9fY2FzZV90aW1lX3N0YXRlX2FsbCwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQp1c2Ffc3RhdGVfcGFuZWxfdGVudGggJT4lCiAgbXV0YXRlKHBvbGljeV92YXJfYmluID0gLlssIHBhc3RlMChwb2xpY3lfdmFyLCAiX2JpbiIpLCBkcm9wID0gVFJVRV0sCiAgICAgICAgIHBvbGljeV92YXIgPSAuWywgcG9saWN5X3ZhciwgZHJvcCA9IFRSVUVdLAogICAgICAgICBwb2xpY3lfdmFyID0gcmVwbGFjZV9uYShwb2xpY3lfdmFyLCB5bWQoIjMwMDAtMDEtMDEiKSkpICU+JQogIG11dGF0ZShzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeV92YXIgLSB0ZW50aF9kYXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjID0gVCkpICU+JQogIGdncGxvdChhZXMoeCA9IGRhdGVfY2FzZSwgeSA9IHN0YXRlLCBmaWxsID0gYXMuZmFjdG9yKHBvbGljeV92YXJfYmluKSkpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArIAogIHNjYWxlX2ZpbGxfYnJld2VyKHN0cl90b190aXRsZSgiU3RheSBhdCBIb21lIE9yZGVyIiksIAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vdC1FbmFjdGVkIiwgIkVuYWN0ZWQiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInF1YWwiLCBwYWxldHRlID0gIlNldDEiKSArCiAgeGxhYigiRGF5cyBzaW5jZSB0ZW50aCBjYXNlIikgKwogIHlsYWIoIiIpICsKICBjb29yZF9jYXJ0ZXNpYW4oZXhwYW5kID0gYygwLDApKSArCiAgdGhlbWVfY2xhc3NpYygxOCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBtYXIyM19jb2hvcnRfY2FsX2J1aWxkMCwgZmlnLndpZHRoID0gNS41ICwgZmlnLmhlaWdodD00LjUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQpiaW5kX3Jvd3MoZXZlbnRfY2FsX3N0YXRlICU+JSBtdXRhdGUob3V0Y29tZSA9ICJMb2cgQ2FzZXMiKSwKICAgICAgICAgIGV2ZW50X2NhbF9ncm93dGhfc3RhdGUgJT4lIG11dGF0ZShvdXRjb21lID0gIkxvZyBDYXNlIEdyb3d0aCIpKSAlPiUKICBtdXRhdGUoY29uZi5sb3cgPSBlc3RpbWF0ZSAtIDIgKiBzZSwgY29uZi5oaWdoID0gZXN0aW1hdGUgKyAyICogc2UpICU+JQogIGZpbHRlcihjb2hvcnQgPT0gIjIwMjBfMDNfMjMiLCBudCA+IDEsCiAgICAgICAgIG91dGNvbWUgPT0gIkxvZyBDYXNlIEdyb3d0aCIpICU+JQojICBmaWx0ZXIoZXZlbnRfdGltZSA+PSAtMjEsIGV2ZW50X3RpbWUgPD0gMjEpICU+JQogIGdncGxvdChhZXMoeCA9IGV2ZW50X3RpbWUsIHkgPSBlc3RpbWF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTAuNSwgbHR5ID0gMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGRhdGEuZnJhbWUoZXZlbnRfdGltZSA9IC0xLCBlc3RpbWF0ZSA9IDApLCBjb2xvciA9ICIjRkRCNTE1Iiwgc2l6ZSA9IDUpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCksIGFscGhhID0gMCkgKwogIGZhY2V0X3dyYXAofiBvdXRjb21lLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeSIpICsKICB4bGFiKCJEYXlzIGZyb20gc3RhdGV3aWRlIHN0YXkgYXQgaG9tZSBvcmRlciIpICsKICB5bGFiKCJFc3RpbWF0ZWQgZWZmZWN0IikgKwogIGdndGl0bGUoIk1hcmNoIDIzIENvaG9ydCIpICsKICB0aGVtZV9idygxOCkKYGBgCgpgYGB7ciBtYXIyM19jb2hvcnRfY2FsX2J1aWxkMSwgZmlnLndpZHRoID0gNS41ICwgZmlnLmhlaWdodD00LjUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQpiaW5kX3Jvd3MoZXZlbnRfY2FsX3N0YXRlICU+JSBtdXRhdGUob3V0Y29tZSA9ICJMb2cgQ2FzZXMiKSwKICAgICAgICAgIGV2ZW50X2NhbF9ncm93dGhfc3RhdGUgJT4lIG11dGF0ZShvdXRjb21lID0gIkxvZyBDYXNlIEdyb3d0aCIpKSAlPiUKICBtdXRhdGUoY29uZi5sb3cgPSBlc3RpbWF0ZSAtIDIgKiBzZSwgY29uZi5oaWdoID0gZXN0aW1hdGUgKyAyICogc2UpICU+JQogIGZpbHRlcihjb2hvcnQgPT0gIjIwMjBfMDNfMjMiLCBudCA+IDEsCiAgICAgICAgIG91dGNvbWUgPT0gIkxvZyBDYXNlIEdyb3d0aCIpICU+JQojICBmaWx0ZXIoZXZlbnRfdGltZSA+PSAtMjEsIGV2ZW50X3RpbWUgPD0gMjEpICU+JQogIGdncGxvdChhZXMoeCA9IGV2ZW50X3RpbWUsIHkgPSBlc3RpbWF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTAuNSwgbHR5ID0gMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGRhdGEuZnJhbWUoZXZlbnRfdGltZSA9IC0xLCBlc3RpbWF0ZSA9IDApLCBjb2xvciA9ICIjRkRCNTE1Iiwgc2l6ZSA9IDUpICsKICBnZW9tX3BvaW50KGRhdGEgPSAuICU+JSBmaWx0ZXIoZXZlbnRfdGltZSA9PSAxMCksIGNvbG9yID0gIiNGREI1MTUiLCBzaXplID0gNSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNvbmYubG93LCB5bWF4ID0gY29uZi5oaWdoKSwgYWxwaGEgPSAwKSArCiAgZmFjZXRfd3JhcCh+IG91dGNvbWUsIG5jb2wgPSAyLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIHhsYWIoIkRheXMgZnJvbSBzdGF0ZXdpZGUgc3RheSBhdCBob21lIG9yZGVyIikgKwogIHlsYWIoIkVzdGltYXRlZCBlZmZlY3QiKSArCiAgZ2d0aXRsZSgiTWFyY2ggMjMgQ29ob3J0IikgKwogIHRoZW1lX2J3KDE4KQpgYGAKCmBgYHtyIG1hcjIzX2NvaG9ydF9jYWxfYnVpbGQyLCBmaWcud2lkdGggPSA1LjUsIGZpZy5oZWlnaHQ9NC41LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KYmluZF9yb3dzKGV2ZW50X2NhbF9zdGF0ZSAlPiUgbXV0YXRlKG91dGNvbWUgPSAiTG9nIENhc2VzIiksCiAgICAgICAgICBldmVudF9jYWxfZ3Jvd3RoX3N0YXRlICU+JSBtdXRhdGUob3V0Y29tZSA9ICJMb2cgQ2FzZSBHcm93dGgiKSkgJT4lCiAgbXV0YXRlKGNvbmYubG93ID0gZXN0aW1hdGUgLSAyICogc2UsIGNvbmYuaGlnaCA9IGVzdGltYXRlICsgMiAqIHNlKSAlPiUKICBmaWx0ZXIoY29ob3J0ID09ICIyMDIwXzAzXzIzIiwgbnQgPiAxLAogICAgICAgICBvdXRjb21lID09ICJMb2cgQ2FzZSBHcm93dGgiKSAlPiUKIyAgZmlsdGVyKGV2ZW50X3RpbWUgPj0gLTIxLCBldmVudF90aW1lIDw9IDIxKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBldmVudF90aW1lLCB5ID0gZXN0aW1hdGUpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0wLjUsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBkYXRhLmZyYW1lKGV2ZW50X3RpbWUgPSAtMSwgZXN0aW1hdGUgPSAwKSwgY29sb3IgPSAiI0ZEQjUxNSIsIHNpemUgPSA1KSArCiAgZ2VvbV9wb2ludChkYXRhID0gLiAlPiUgZmlsdGVyKGV2ZW50X3RpbWUgJWluJSBjKC0xMCwgMTApKSwgY29sb3IgPSAiI0ZEQjUxNSIsIHNpemUgPSA1KSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY29uZi5sb3csIHltYXggPSBjb25mLmhpZ2gpLCBhbHBoYSA9IDApICsKICBmYWNldF93cmFwKH4gb3V0Y29tZSwgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgeGxhYigiRGF5cyBmcm9tIHN0YXRld2lkZSBzdGF5IGF0IGhvbWUgb3JkZXIiKSArCiAgeWxhYigiRXN0aW1hdGVkIGVmZmVjdCIpICsKICBnZ3RpdGxlKCJNYXJjaCAyMyBDb2hvcnQiKSArCiAgdGhlbWVfYncoMTgpCmBgYAoKYGBge3IgbWFyMjNfY29ob3J0X2NhbF9idWlsZDMsIGZpZy53aWR0aCA9IDUuNSwgZmlnLmhlaWdodD00LjUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQpiaW5kX3Jvd3MoZXZlbnRfY2FsX3N0YXRlICU+JSBtdXRhdGUob3V0Y29tZSA9ICJMb2cgQ2FzZXMiKSwKICAgICAgICAgIGV2ZW50X2NhbF9ncm93dGhfc3RhdGUgJT4lIG11dGF0ZShvdXRjb21lID0gIkxvZyBDYXNlIEdyb3d0aCIpKSAlPiUKICBtdXRhdGUoY29uZi5sb3cgPSBlc3RpbWF0ZSAtIDIgKiBzZSwgY29uZi5oaWdoID0gZXN0aW1hdGUgKyAyICogc2UpICU+JQogIGZpbHRlcihjb2hvcnQgPT0gIjIwMjBfMDNfMjMiLCBudCA+IDEsCiAgICAgICAgIG91dGNvbWUgPT0gIkxvZyBDYXNlIEdyb3d0aCIpICU+JQojICBmaWx0ZXIoZXZlbnRfdGltZSA+PSAtMjEsIGV2ZW50X3RpbWUgPD0gMjEpICU+JQogIGdncGxvdChhZXMoeCA9IGV2ZW50X3RpbWUsIHkgPSBlc3RpbWF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTAuNSwgbHR5ID0gMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGRhdGEuZnJhbWUoZXZlbnRfdGltZSA9IC0xLCBlc3RpbWF0ZSA9IDApKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCksIGFscGhhID0gMCkgKwogIGZhY2V0X3dyYXAofiBvdXRjb21lLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeSIpICsKICB4bGFiKCJEYXlzIGZyb20gc3RhdGV3aWRlIHN0YXkgYXQgaG9tZSBvcmRlciIpICsKICB5bGFiKCJFc3RpbWF0ZWQgZWZmZWN0IikgKwogIGdndGl0bGUoIk1hcmNoIDIzIENvaG9ydCIpICsKICB0aGVtZV9idygxOCkKYGBgCgpgYGB7ciBtYXIyM19jb2hvcnRfY2FsX2J1aWxkNCwgZmlnLndpZHRoID0gNS41LCBmaWcuaGVpZ2h0PTQuNSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CmJpbmRfcm93cyhldmVudF9jYWxfc3RhdGUgJT4lIG11dGF0ZShvdXRjb21lID0gIkxvZyBDYXNlcyIpLAogICAgICAgICAgZXZlbnRfY2FsX2dyb3d0aF9zdGF0ZSAlPiUgbXV0YXRlKG91dGNvbWUgPSAiTG9nIENhc2UgR3Jvd3RoIikpICU+JQogIG11dGF0ZShjb25mLmxvdyA9IGVzdGltYXRlIC0gMiAqIHNlLCBjb25mLmhpZ2ggPSBlc3RpbWF0ZSArIDIgKiBzZSkgJT4lCiAgZmlsdGVyKGNvaG9ydCA9PSAiMjAyMF8wM18yMyIsIG50ID4gMSwKICAgICAgICAgb3V0Y29tZSA9PSAiTG9nIENhc2UgR3Jvd3RoIikgJT4lCiMgIGZpbHRlcihldmVudF90aW1lID49IC0yMSwgZXZlbnRfdGltZSA8PSAyMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZXZlbnRfdGltZSwgeSA9IGVzdGltYXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZGF0YS5mcmFtZShldmVudF90aW1lID0gLTEsIGVzdGltYXRlID0gMCkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCkpICsKICBmYWNldF93cmFwKH4gb3V0Y29tZSwgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgeGxhYigiRGF5cyBmcm9tIHN0YXRld2lkZSBzdGF5IGF0IGhvbWUgb3JkZXIiKSArCiAgeWxhYigiRXN0aW1hdGVkIGVmZmVjdCIpICsKICBnZ3RpdGxlKCJNYXJjaCAyMyBDb2hvcnQiKSArCiAgdGhlbWVfYncoMTgpCmBgYAoKYGBge3Igc3RhY2tlZF9ldmVudF9jYWxlbmRhcl9ncm93dGgsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBmaWcud2lkdGggPSA1LjUsIGZpZy5oZWlnaHQ9NC41LCBjYXB0aW9uID0gIkNhbGVuZGFyIHRpbWUgZXN0aW1hdGVzIn0KYmluZF9yb3dzKGV2ZW50X2NhbF9ncm93dGhfc3RhdGUgJT4lIG11dGF0ZShvdXRjb21lID0gIkxvZyBDYXNlIEdyb3d0aCIpKSAlPiUKICBncm91cF9ieShldmVudF90aW1lLCBvdXRjb21lKSAlPiUKICBmaWx0ZXIoc3VtKG50KSA+IDIpICU+JQogIG11dGF0ZShjb25mLmxvdyA9IGVzdGltYXRlIC0gMiAqIHNlLCBjb25mLmhpZ2ggPSBlc3RpbWF0ZSArIDIgKiBzZSkgJT4lCiAgZmlsdGVyKGNvaG9ydCA9PSAiYXZlcmFnZSIpICU+JQogIGdncGxvdChhZXMoeCA9IGV2ZW50X3RpbWUsIHkgPSBlc3RpbWF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTAuNSwgbHR5ID0gMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGRhdGEuZnJhbWUoZXZlbnRfdGltZSA9IC0xLCBlc3RpbWF0ZSA9IDApKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY29uZi5sb3csIHltYXggPSBjb25mLmhpZ2gpKSArCiBmYWNldF93cmFwKH4gb3V0Y29tZSwgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlX3kiKSArCnhsYWIoIkRheXMgZnJvbSBzdGF0ZXdpZGUgc3RheSBhdCBob21lIG9yZGVyIikgKwp5bGFiKCJFc3RpbWF0ZWQgZWZmZWN0IikgKwp0aGVtZV9idygxOCkKYGBg